今天在测试更新 SqlServer 表的 datetime 字段时,突然发现并没有更新成功,同时也没有报错,感觉十分诧异,因此仔细排查了一下,终于发现是和字段本身的精度有关。
现象
假设我们现在有一张 SqlServer 表 basic_info,其表结构为:
字段名 | 类型 |
---|---|
name | varchar |
open_time | datetime |
现在其中有一条数据:
name | open_time |
---|---|
Jack | 2014-05-25 11:11:01.260 |
现在我想把这条数据的 open_time 字段修改为 2014-05-25 11:11:01.262
,执行语句:1
update basic_info set open_time = '2014-05-25 11:11:01.262' where name = 'Jack';
结果是并没有更新为我想要的值:
name | open_time |
---|---|
Jack | 2014-05-25 11:11:01.263 |
这个 263
是怎么出现的呢?
原因
这个问题我排查了很久,最终在关于 datetime 字段定义 的网站上,在关于字段描述的表中,有这么一行:1
Accuracy Rounded to increments of .000, .003, or .007 seconds
意思就是说, datetime 这个字段的 精度
,四舍五入后会变为 .000, .003, or .007 秒。
这样的话,也就能说这个字段的时间毫秒数的个位数,只会是 0、3、7
,那么也就能解释上面的现象,为什么我想更新成 2
,最终变成了 3
。
解决方法
当你对于精度要求不高的话,比如只需要精确到秒级别,那么这个字段的使用完全是没有问题的。
但如果你一定需要精确到毫秒呢?那么可以使用 datetime2
类型,它的精度可以精确到 100 纳秒
。
总结
对于服务端开发人员,数据库几乎是一个无法避免的中间件,虽然我们并非专业的 DBA,但多了解一些总是好事。
有兴趣的话可以访问我的博客或者关注我的公众号、头条号,说不定会有意外的惊喜。
公众号:健程之道